#include "chatuserlist.h"
#include <QScrollBar>
#include <QTimer>
#include <QCoreApplication>
#include "usermgr.h"

ChatUserList::ChatUserList(QWidget *parent):QListWidget(parent),_load_pending(false)
{
    Q_UNUSED(parent);

    //将横向和纵向的滚动条默认关闭
    this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

    //安装事件过滤器
    this->viewport()->installEventFilter(this);//此处可能需要this->viewport()改为this
}

ChatUserList::~ChatUserList()
{

}

//事件过滤器，有时候基类没提供对应的事件导致无法重载，因此需要自己写，这时候事件过滤器则非常灵活
bool ChatUserList::eventFilter(QObject *watched, QEvent *event)
{
    //检查鼠标悬浮或者离开
    if(watched == this->viewport())//此处可能需要this->viewport()改为this
    {
        if(event->type() == QEvent::Enter)//鼠标进入，显示垂直滚动条
        {
            this->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
        }
        else if(event->type() == QEvent::Leave)//鼠标离开，隐藏垂直滚动条
        {
            this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
        }
    }

    //检查是否鼠标滚轮事件
    // 检查事件是否是鼠标滚轮事件
    if (watched == this->viewport() && event->type() == QEvent::Wheel) {
        QWheelEvent *wheelEvent = static_cast<QWheelEvent*>(event);
        int numDegrees = wheelEvent->angleDelta().y() / 8;
        int numSteps = numDegrees / 15; // 计算滚动步数

        // 设置滚动幅度
        this->verticalScrollBar()->setValue(this->verticalScrollBar()->value() - numSteps);

        // 检查是否滚动到底部
        QScrollBar *scrollBar = this->verticalScrollBar();
        int maxScrollValue = scrollBar->maximum();
        int currentValue = scrollBar->value();
        //int pageSize = 10; // 每页加载的联系人数量

        if (maxScrollValue - currentValue <= 0) {
            auto b_loaded = UserMgr::GetInstance()->IsLoadChatFin();
            if(b_loaded)
            {
                return true;
            }

            if(_load_pending)//加载过程
            {
                return true;
            }

            // 滚动到底部，加载新的联系人
            //qDebug()<<"load more chat user";
            _load_pending = true;

            //设定定时器，实现滚动间隔 100ms
            QTimer::singleShot(100,[this](){
                _load_pending = false;
                QCoreApplication::quit();//完成后退出应用程序
            });

            emit sig_loading_chat_user();//滑动到底部，发送信号通知聊天界面加载更多聊天内容
        }

        return true; // 停止事件传递
    }

    return QListWidget::eventFilter(watched, event);//其他事件依然走正常的事件
}
